package com.smart.community.feign.region.service;

import java.util.List;
import java.util.Map;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import com.smart.community.feign.region.dto.BuildingInfoDTO;
import com.smart.community.feign.region.dto.CommunityInfoDTO;
import com.smart.community.feign.region.dto.HouseholdInfoDTO;
import com.smart.community.feign.region.dto.RegionDTO;
import com.smart.community.feign.region.dto.UnitInfoDTO;
import com.smart.community.feign.region.fallback.RegionDataFeignFallbackFactory;

/**
 * 区域数据Feign接口
 * 提供房户、楼栋、单元、社区等基础数据查询接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 2.0.1 - 修复Feign接口路径，与Controller保持一致
 */
@FeignClient(name = "smart-community-region", 
             path = "/region/data", 
             fallbackFactory = RegionDataFeignFallbackFactory.class,
             contextId = "regionDataFeignService")
public interface RegionDataFeignService {
    
    /**
     * 根据房户ID获取房户信息
     * 
     * @param householdId 房户ID
     * @return 房户信息
     */
    @GetMapping("/feign/region/household/{householdId}")
    HouseholdInfoDTO getHouseholdById(@PathVariable("householdId") Long householdId);
    
    /**
     * 根据楼栋ID获取楼栋信息
     * 
     * @param buildingId 楼栋ID
     * @return 楼栋信息
     */
    @GetMapping("/feign/region/building/{buildingId}")
    BuildingInfoDTO getBuildingById(@PathVariable("buildingId") Long buildingId);
    
    /**
     * 根据单元ID获取单元信息
     * 
     * @param unitId 单元ID
     * @return 单元信息
     */
    @GetMapping("/feign/region/unit/{unitId}")
    UnitInfoDTO getUnitById(@PathVariable("unitId") Long unitId);
    
    /**
     * 根据社区ID获取社区信息
     * 
     * @param communityId 社区ID
     * @return 社区信息
     */
    @GetMapping("/feign/region/community/{communityId}")
    CommunityInfoDTO getCommunityById(@PathVariable("communityId") Long communityId);
    
    /**
     * 批量获取房户信息
     * 
     * @param householdIds 房户ID列表
     * @return 房户信息列表
     */
    @PostMapping("/feign/region/households/batch")
    List<HouseholdInfoDTO> getHouseholdsByIds(@RequestBody List<Long> householdIds);
    
    /**
     * 批量获取楼栋信息
     * 
     * @param buildingIds 楼栋ID列表
     * @return 楼栋信息列表
     */
    @PostMapping("/feign/region/buildings/batch")
    List<BuildingInfoDTO> getBuildingsByIds(@RequestBody List<Long> buildingIds);
    
    /**
     * 批量获取单元信息
     * 
     * @param unitIds 单元ID列表
     * @return 单元信息列表
     */
    @PostMapping("/feign/region/units/batch")
    List<UnitInfoDTO> getUnitsByIds(@RequestBody List<Long> unitIds);
    
    /**
     * 批量获取社区信息
     * 
     * @param communityIds 社区ID列表
     * @return 社区信息列表
     */
    @PostMapping("/feign/region/communities/batch")
    List<CommunityInfoDTO> getCommunitiesByIds(@RequestBody List<Long> communityIds);
    
    /**
     * 根据社区ID获取房户ID集合
     * 用于业主统计功能，获取指定社区下的所有房户ID
     * 
     * @param communityIds 社区ID列表
     * @return 房户ID列表
     */
    @PostMapping("/feign/region/household-ids/by-communities")
    List<Long> getHouseholdIdsByCommunityIds(@RequestBody List<Long> communityIds);
    
    /**
     * 根据社区ID获取楼栋ID集合
     * 用于物业公司统计功能，获取指定社区下的所有楼栋ID
     * 
     * @param communityIds 社区ID列表
     * @return 楼栋ID列表
     */
    @PostMapping("/feign/region/building-ids/by-communities")
    List<Long> getBuildingIdsByCommunityIds(@RequestBody List<Long> communityIds);
    
    /**
     * 根据楼栋ID获取单元ID集合
     * 用于物业公司统计功能，获取指定楼栋下的所有单元ID
     * 
     * @param buildingIds 楼栋ID列表
     * @return 单元ID列表
     */
    @PostMapping("/feign/region/unit-ids/by-buildings")
    List<Long> getUnitIdsByBuildingIds(@RequestBody List<Long> buildingIds);
    
    /**
     * 根据单元ID获取房户ID集合
     * 用于物业公司统计功能，获取指定单元下的所有房户ID
     * 
     * @param unitIds 单元ID列表
     * @return 房户ID列表
     */
    @PostMapping("/feign/region/household-ids/by-units")
    List<Long> getHouseholdIdsByUnitIds(@RequestBody List<Long> unitIds);
    
    /**
     * 根据社区ID获取完整的层级结构ID集合
     * 用于物业公司统计功能，一次性获取社区→楼栋→单元→房户的完整层级ID
     * 
     * @param communityIds 社区ID列表
     * @return 包含各层级ID的Map结构
     */
    @PostMapping("/feign/region/hierarchy-ids/by-communities")
    Map<String, List<Long>> getHierarchyIdsByCommunityIds(@RequestBody List<Long> communityIds);
    
	/**
	 * 获取区域层级路径
	 * 获取从根区域到指定区域的层级路径
	 * 
	 * @param regionId 区域ID
	 * @return 区域层级路径列表
	 */
	@GetMapping("/feign/region/{regionId}/path")
	List<RegionDTO> getRegionPath(@PathVariable("regionId") Long regionId);
	
	/**
	 * 根据房户ID获取关联的用户ID列表
	 * 用于报修工单查询，获取房户下所有业主和住户的用户ID
	 * 
	 * @param householdId 房户ID
	 * @return 用户ID列表
	 */
	@GetMapping("/feign/region/household/{householdId}/user-ids")
	List<Long> getUserIdsByHouseholdId(@PathVariable("householdId") Long householdId);
	
	/**
	 * 根据房户ID列表获取关联的用户ID列表
	 * 用于报修工单查询，获取多个房户下所有业主和住户的用户ID
	 * 
	 * @param householdIds 房户ID列表
	 * @return 用户ID列表
	 */
	@PostMapping("/feign/region/households/user-ids")
	List<Long> getUserIdsByHouseholdIds(@RequestBody List<Long> householdIds);
} 